home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
lisp
/
kcl
/
akcl
/
akcl1615.lha
/
c
/
faslsgi4.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-07
|
10KB
|
456 lines
/*
(c) Copyright Taiichi Yuasa and Masami Hagiya, 1984. All rights reserved.
Copying of this file is authorized to users who have executed the true and
proper "License Agreement for Kyoto Common LISP" with SIGLISP.
*/
/* make sure we do allocate aligned for double */
/* actually I understand that ld -A wants alignment on
the page. ie multiple of 0x1000
*/
#define ALIGN 12
char *
alloc_contblock_aligned(size)
int size;
{
char *tmp_alloc = ALLOC_ALIGNED(alloc_contblock,size,(1<<12));
bzero(tmp_alloc, size);
return(tmp_alloc);
}
#define alloc_contblock alloc_contblock_aligned
#ifdef BSD
#include <a.out.h>
#endif
#ifdef ATT
#ifdef mips
#include <unistd.h>
#include <aouthdr.h>
#endif
#include <filehdr.h>
#include <scnhdr.h>
#include <syms.h>
#endif
#ifdef E15
#include <a.out.h>
#define exec bhdr
#define a_text tsize
#define a_data dsize
#define a_bss bsize
#define a_syms ssize
#define a_trsize rtsize
#define a_drsize rdsize
#endif
#define MAXPATHLEN 1024
int
fasload(faslfile)
object faslfile;
{
#ifdef BSD
struct exec header, newheader;
#define textsize header.a_text
#define datasize header.a_data
#define bsssize header.a_bss
#define textstart sizeof(header)
#define newbsssize newheader.a_bss
#endif
#ifdef ATT
struct filehdr fileheader;
struct scnhdr sectionheader;
#ifdef mips
struct aouthdr aouthdr, newaouthdr;
HDRR symhdr;
# define textsize aouthdr.tsize
# define datasize aouthdr.dsize
# define bsssize aouthdr.bsize
# define textstart sectionheader.s_scnptr
# define newdatasize newaouthdr.dsize
# define newbsssize newaouthdr.bsize
#else
int textsize, datasize, bsssize;
int textstart;
#endif /* mips */
#endif
#ifdef E15
struct exec header;
#define textsize header.a_text
#define datasize header.a_data
#define bsssize header.a_bss
#define textstart sizeof(header)
#endif
object memory, data, tempfile;
FILE *fp;
char filename[MAXPATHLEN];
char tempfilename[32];
char command[MAXPATHLEN * 2];
int i;
object *old_vs_base = vs_base;
object *old_vs_top = vs_top;
#ifdef IBMRT
#endif
coerce_to_filename(faslfile, filename);
faslfile = open_stream(faslfile, smm_input, Cnil, Kerror);
vs_push(faslfile);
fp = faslfile->sm.sm_fp;
#ifdef BSD
fread(&header, sizeof(header), 1, fp);
#endif
#ifdef ATT
fread(&fileheader, sizeof(fileheader), 1, fp);
#ifdef mips
fread(&aouthdr, AOUTHSZ, 1, fp);
#else
#ifdef S3000
if(fileheader.f_opthdr != 0) fseek(fp,fileheader.f_opthdr,1);
#endif
fread(§ionheader, sizeof(sectionheader), 1, fp);
textsize = sectionheader.s_size;
textstart = sectionheader.s_scnptr;
fread(§ionheader, sizeof(sectionheader), 1, fp);
datasize = sectionheader.s_size;
fread(§ionheader, sizeof(sectionheader), 1, fp);
if (strcmp(sectionheader.s_name, ".bss") == 0)
bsssize = sectionheader.s_size;
else
bsssize = 0;
#endif /* mips */
#endif
#ifdef E15
fread(&header, sizeof(header), 1, fp);
#endif
memory = alloc_object(t_cfdata);
memory->cfd.cfd_self = NULL;
memory->cfd.cfd_start = NULL;
memory->cfd.cfd_size = textsize + datasize + bsssize;
#ifdef mips
#define MIPS_ROUND 0xC
memory->cfd.cfd_size += MIPS_ROUND; /* room for 'ld' to round text upward */
#endif
vs_push(memory);
memory->cfd.cfd_start = alloc_contblock(memory->cfd.cfd_size);
#ifdef BSD
fseek(fp,
header.a_text+header.a_data+
header.a_syms+header.a_trsize+header.a_drsize,
1);
fread(&i, sizeof(i), 1, fp);
fseek(fp, i - sizeof(i), 1);
#endif
#ifdef ATT
#ifdef mips
fseek(fp, fileheader.f_symptr, SEEK_SET);
fread(&symhdr, cbHDRR, 1, fp);
fseek(fp, symhdr.cbExtOffset + symhdr.iextMax * cbEXTR, SEEK_SET);
#else
fseek(fp,
fileheader.f_symptr + SYMESZ*fileheader.f_nsyms,
0);
fread(&i, sizeof(i), 1, fp);
fseek(fp, i - sizeof(i), 1);
while ((i = getc(fp)) == 0)
;
ungetc(i, fp);
#endif /* mips */
#endif
#ifdef E15
fseek(fp,
header.a_text+header.a_data+
header.a_syms+header.a_trsize+header.a_drsize,
1);
#endif
data = read_fasl_vector(faslfile);
vs_push(data);
close_stream(faslfile, TRUE);
sprintf(tempfilename, "/tmp/fasltemp%d", getpid());
AGAIN:
#ifdef BSD
sprintf(command,
"ld -d -N -x -A %s -T %x %s -o %s",
kcl_self,
memory->cfd.cfd_start,
filename,
tempfilename);
#endif
#ifdef ATT
#ifdef mips
sprintf(command,
"ld -s -A %s -N -T %x %s -o %s",
kcl_self,
(long)memory->cfd.cfd_start+SCNROUND-1&~(SCNROUND-1),
filename,
tempfilename);
#else
coerce_to_filename(symbol_value(siVsystem_directory),
system_directory);
sprintf(command,
"%sild %s %d %s %s",
system_directory,
kcl_self,
memory->cfd.cfd_start,
filename,
tempfilename);
#endif /* mips */
#endif
#ifdef E15
coerce_to_filename(symbol_value(siVsystem_directory),
system_directory);
sprintf(command,
"%sild %s %d %s %s",
system_directory,
kcl_self,
memory->cfd.cfd_start,
filename,
tempfilename);
#endif
if (system(command) != 0)
FEerror("The linkage editor failed.", 0);
tempfile = make_simple_string(tempfilename);
vs_push(tempfile);
tempfile = open_stream(tempfile, smm_input, Cnil, Kerror);
vs_push(tempfile);
fp = tempfile->sm.sm_fp;
#ifdef BSD
fread(&newheader, sizeof(header), 1, fp);
if (newbsssize != bsssize) {
insert_contblock(memory->cfd.cfd_start, memory->cfd.cfd_size);
bsssize = newbsssize;
memory->cfd.cfd_start = NULL;
memory->cfd.cfd_size = textsize + datasize + bsssize;
memory->cfd.cfd_start = alloc_contblock(memory->cfd.cfd_size);
close_stream(tempfile, TRUE);
unlink(tempfilename);
goto AGAIN;
}
#endif
#ifdef mips
fseek(fp, FILHSZ, SEEK_CUR);
fread(&newaouthdr, AOUTHSZ, 1, fp);
if (newdatasize + newbsssize > datasize + bsssize) {
insert_contblock(memory->cfd.cfd_start, memory->cfd.cfd_size);
datasize = newdatasize;
bsssize = newbsssize;
memory->cfd.cfd_start = NULL;
memory->cfd.cfd_size = textsize + datasize + bsssize + MIPS_ROUND;
memory->cfd.cfd_start = alloc_contblock(memory->cfd.cfd_size);
close_stream(tempfile, TRUE);
unlink(tempfilename);
goto AGAIN;
}
fread(§ionheader, sizeof sectionheader, 1, fp);
#endif
if (fseek(fp, textstart, 0) < 0)
error("file seek error");
#ifdef mips
printf("start address -T %x ",memory->cfd.cfd_start);
bzero(memory->cfd.cfd_start, MIPS_ROUND);
fread(sectionheader.s_vaddr, textsize + datasize, 1, fp);
#else
fread(memory->cfd.cfd_start, textsize + datasize, 1, fp);
#endif
close_stream(tempfile, TRUE);
unlink(tempfilename);
call_init(0,memory,data);
vs_base = old_vs_base;
vs_top = old_vs_top;
return(memory->cfd.cfd_size);
}
#if defined BSD || defined mips
int
faslink(faslfile, ldargstring)
object faslfile, ldargstring;
{
#ifdef mips
struct filehdr faslheader;
struct aouthdr aouthdr;
struct scnhdr sectionheader;
HDRR symhdr;
#define ldcmdfmt "ld -s -A %s -N -T %x %s %s -o %s"
#else
struct exec header, faslheader;
#define textsize header.a_text
#define datasize header.a_data
#define bsssize header.a_bss
#define textstart sizeof(header)
#define ldcmdfmt "ld -d -N -x -A %s -T %x %s %s -o %s"
#endif
object memory, data, tempfile;
FILE *fp;
char filename[MAXPATHLEN];
char ldargstr[MAXPATHLEN];
char tempfilename[32];
char command[MAXPATHLEN * 2];
char buf[BUFSIZ];
int i;
object *old_vs_base = vs_base;
object *old_vs_top = vs_top;
#ifdef IBMRT
#endif
coerce_to_filename(ldargstring, ldargstr);
coerce_to_filename(faslfile, filename);
sprintf(tempfilename, "/tmp/fasltemp%d", getpid());
sprintf(command,
ldcmdfmt,
kcl_self,
(int)core_end,
filename,
ldargstr,
tempfilename);
if (system(command) != 0)
FEerror("The linkage editor failed.", 0);
fp = fopen(tempfilename, "r");
setbuf(fp, buf);
#ifdef mips
fseek(fp, FILHSZ, SEEK_CUR);
fread(&aouthdr, AOUTHSZ, 1, fp);
#else
fread(&header, sizeof(header), 1, fp);
#endif
memory = alloc_object(t_cfdata);
memory->cfd.cfd_self = NULL;
memory->cfd.cfd_start = NULL;
memory->cfd.cfd_size = textsize + datasize + bsssize;
#ifdef mips
memory->cfd.cfd_size += MIPS_ROUND;
#endif
vs_push(memory);
memory->cfd.cfd_start = alloc_contblock(memory->cfd.cfd_size);
fclose(fp);
faslfile = open_stream(faslfile, smm_input, Cnil, Kerror);
vs_push(faslfile);
fp = faslfile->sm.sm_fp;
fread(&faslheader, sizeof(faslheader), 1, fp);
#ifdef mips
fseek(fp, AOUTHSZ, SEEK_CUR);
fread(§ionheader, SCNHSZ, 1, fp);
fseek(fp, faslheader.f_symptr, SEEK_SET);
fread(&symhdr, cbHDRR, 1, fp);
fseek(fp, symhdr.cbExtOffset + symhdr.iextMax * cbEXTR, SEEK_SET);
#else
fseek(fp,
faslheader.a_text+faslheader.a_data+
faslheader.a_syms+faslheader.a_trsize+faslheader.a_drsize,
1);
fread(&i, sizeof(i), 1, fp);
fseek(fp, i - sizeof(i), 1);
#endif
data = read_fasl_vector(faslfile);
vs_push(data);
close_stream(faslfile, TRUE);
sprintf(command,
ldcmdfmt,
kcl_self,
#ifdef mips
(long)memory->cfd.cfd_start+SCNROUND-1&~(SCNROUND-1),
#else
memory->cfd.cfd_start,
#endif
filename,
ldargstr,
tempfilename);
if (system(command) != 0)
FEerror("The linkage editor failed.", 0);
tempfile = make_simple_string(tempfilename);
vs_push(tempfile);
tempfile = open_stream(tempfile, smm_input, Cnil, Kerror);
vs_push(tempfile);
fp = tempfile->sm.sm_fp;
#ifdef mips
fseek(fp, FILHSZ, SEEK_CUR);
fread(&aouthdr, AOUTHSZ, 1, fp);
fread(§ionheader, sizeof sectionheader, 1, fp);
#endif
if (fseek(fp, textstart, 0) < 0)
error("file seek error");
#ifdef mips
printf("start address -T %x ",memory->cfd.cfd_start);
bzero(memory->cfd.cfd_start, MIPS_ROUND);
fread(sectionheader.s_vaddr, textsize + datasize, 1, fp);
#else
fread(memory->cfd.cfd_start, textsize + datasize, 1, fp);
#endif
close_stream(tempfile, TRUE);
unlink(tempfilename);
call_init(0,memory,data);
vs_base = old_vs_base;
vs_top = old_vs_top;
return(memory->cfd.cfd_size);
}
siLfaslink()
{
bds_ptr old_bds_top;
int i;
object package;
check_arg(2);
check_type_or_pathname_string_symbol_stream(&vs_base[0]);
check_type_string(&vs_base[1]);
vs_base[0] = coerce_to_pathname(vs_base[0]);
vs_base[0]->pn.pn_type = FASL_string;
vs_base[0] = namestring(vs_base[0]);
package = symbol_value(Vpackage);
old_bds_top = bds_top;
bds_bind(Vpackage, package);
i = faslink(vs_base[0], vs_base[1]);
bds_unwind(old_bds_top);
vs_top = vs_base;
vs_push(make_fixnum(i));
}
#endif
#define FASLINK